---
title: "Java ReentrantLock 重入锁"
categories:
- java
- concurrent
tags:
---

<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org7e78c86">Compare with synchronized</a></li>
<li><a href="#org6938fdc">公平锁和非公平锁</a></li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-org7e78c86">
<h2 id="org7e78c86">Compare with synchronized</h2>
<div class="outline-text-2" id="text-org7e78c86">
<p>
{% raw %} synchronized {% endraw %} 这个关键字的底层交由了JVM通过C++来实现，依赖于JVM，程序员无法在Java层面进行扩展和优化，比如无法中断一个正在等待获取锁的线程，或者无法在请求一个锁时无限的等待下去。
</p>
<p>
{% raw %} ReentranLock {% endraw %} 的加锁行为和Synchronized类似,都是可重入的锁,而ReentrantLock则提供了中断。
</p>
</div>
</div>
<div class="outline-2" id="outline-container-org6938fdc">
<h2 id="org6938fdc">公平锁和非公平锁</h2>
<div class="outline-text-2" id="text-org6938fdc">
<p>
ReentranLock分为公平锁和非公平锁.二者的区别就在获取锁是否和排队顺序相关.
</p>
<p>
如果当前锁被另一个线程持有,那么当前申请锁的线程会被挂起等待,然后加入一个等待队列里。
理论上,先调用lock函数被挂起等待的线程应该排在等待队列的前端,后调用的就排在后边。
如果此时,锁被释放,需要通知等待线程再次尝试获取锁，两种锁的行为如下：
</p>
<ul class="org-ul">
<li>公平锁会让最先进入队列的线程获得锁,</li>
<li>非公平锁则会唤醒所有线程,让它们再次尝试获取锁,所以可能会导致后来的线程先获得了锁,则就是非公平.</li>
</ul>
<div class="org-src-container">
<pre class="src src-java"><span style="font-weight: bold; font-style: italic;">// </span><span style="font-weight: bold; font-style: italic;">ctor</span>
<span style="font-weight: bold;">public</span> <span style="font-weight: bold;">ReentrantLock</span>(<span style="font-weight: bold; text-decoration: underline;">boolean</span> <span style="font-weight: bold; font-style: italic;">fair</span>) {
    sync = fair ? <span style="font-weight: bold;">new</span> <span style="font-weight: bold; text-decoration: underline;">FairSync</span>() : <span style="font-weight: bold;">new</span> <span style="font-weight: bold; text-decoration: underline;">NonfairSync</span>();
}
</pre>
</div>
<p>
其中```FairSync```,```NonfairSync```都继承了```AbstractQueuedSynchronizer```
</p>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
